"""衍生配置处理模块

此模块用于处理meta.json的衍生配置。衍生配置是指基于原始配置信息,通过一定的转换规则生成的新的配置信息。
这些配置会保存在meta.json的derived字段中,不会修改原始配置。

目前支持的表级衍生配置:
- table.derived.naming.*: 各种命名规则转换
- table.derived.java.imports: 实体类需要的所有导入语句集合
- table.derived.java.package_path: 包名对应的文件系统路径

目前支持的字段级衍生配置:
- columns.*.derived.java.type: 将MySQL类型转换为Java类型
- columns.*.derived.java.import: 生成Java类型所需的import语句
- columns.*.derived.java.default_value: 生成Java类型的默认值
- columns.*.derived.java.datetime_format: Java日期时间格式
- columns.*.derived.ts.datetime_format: TypeScript日期时间格式
- columns.*.derived.ui.datetime_format: UI日期时间显示格式

术语:
- 表级配置: 作用于整个表/实体的配置信息，存储在meta.json的table字段中
- 字段级配置: 作用于单个字段/列的配置信息，存储在meta.json的columns字段中
- 表级衍生配置: 基于原始配置自动生成的表级配置，存储在table.derived字段中
- 字段级衍生配置: 基于原始配置自动生成的字段级配置，存储在columns.*.derived字段中
"""

from typing import Dict, Any
from .derived_modules.naming import generate_naming
from .derived_modules.java import derive_java_config
from .derived_modules.typescript import derive_ts_config
from .derived_modules.ui import derive_ui_config
from .derived_modules.golang import derive_golang_config  # 从 derived_modules/golang.py 导入
from .derived_modules.react import derive_react_config
from .derived_modules.datetime_formats import derive_datetime_formats
from .derived_modules.primarykey import derive_primarykey_config


def derive(meta_info: Dict[str, Any]) -> Dict[str, Any]:
    """处理meta.json的所有衍生配置

    这个函数会按顺序调用所有的derive_*_config函数,生成完整的衍生配置信息。
    处理顺序:
    1. 生成naming信息
    2. 生成Java相关衍生配置
    3. 生成TypeScript相关衍生配置
    4. 生成UI相关衍生配置
    5. 生成Golang相关衍生配置
    6. 生成React相关衍生配置
    7. 生成日期时间格式配置
    8. 生成主键衍生配置（最后处理）

    Args:
        meta_info: meta.json格式的结构体

    Returns:
        Dict[str, Any]: 更新后的结构体,包含所有衍生配置信息
    """
    # 检查是否已经处理过
    if meta_info.get("table", {}).get("has_derived", False):
        return meta_info

    # 1. 生成naming信息
    meta_info = generate_naming(meta_info)

    # 2. 生成各种技术栈的衍生配置
    meta_info = derive_java_config(meta_info)
    meta_info = derive_ts_config(meta_info)
    meta_info = derive_ui_config(meta_info)
    meta_info = derive_golang_config(meta_info)  # 使用 derived/golang.py 中的实现
    meta_info = derive_react_config(meta_info)   # 新增react配置

    meta_info = derive_datetime_formats(meta_info)  # 处理日期时间格式
    meta_info = derive_primarykey_config(meta_info)  # 处理主键衍生配置（依赖其他衍生配置）

    # 标记为已处理
    if "table" not in meta_info:
        meta_info["table"] = {}
    meta_info["table"]["has_derived"] = True

    return meta_info
